package cn.dapeng.random;

/**
 * @BelongProject study
 * @BelongPackage cn.dapeng.random
 * @Description 把等概率1~5发生器，改成0~1等概率发生器
 * @ClassName RandomT02
 * @Author xupenghong
 * @Date 2024/8/27 15:39
 * @Version 1.0.0
 */
public class RandomT02 {

    /**
     * 1 ~ 5等概率发生器
     *
     * @return
     */
    public static int f0() {
        return 1 + ((int) (Math.random() * 5));
    }

    /**
     * 把等于3的情况 重新计算 这样等于1和2  和 等于3和4 的情况 就等概率的
     * 改写成0~1等概率发生器
     *
     * @return
     */
    public static int f1() {
        int ans;
        do {
            ans = f0();
        } while (ans == 3);
        return ans > 3 ? 1 : 0;
    }

    /**
     * 把0~1等概率发生器，改成0~7等概率发生器
     *
     * @return
     */
    public static int f2() {
        return (f1() << 2) + (f1() << 1) + f1();
    }

    /**
     * 1 ~ 7 等概率返回
     *
     * @return
     */
    public static int f2_1() {
        int ans = (f1() << 2) + (f1() << 1) + f1();

        while (ans == 0) {
            ans = (f1() << 2) + (f1() << 1) + f1();
        }
        return ans;
    }


    /**
     * 1 ~ 7 等概率返回
     *
     * @return
     */
    public static int f2_2() {
        int ans = (f1() << 2) + (f1() << 1) + f1();

        do {
            ans = (f1() << 2) + (f1() << 1) + f1();
        } while (ans == 7);
        return ans + 1;
    }

    public static void main(String[] args) {
        int testTime = 10_0000;
        // 测试是否是等概率发生器
//        int[] count = new int[6];
//        for (int i = 0; i < testTime; i++) {
//            count[f0()]++;
//        }
//
        // 测试是否是0~1等概率发生器
//        int[] count = new int[2];
//        for (int i = 0; i < testTime; i++) {
//            count[f1()]++;
//        }


        // 测试是否是0 ~ 7等概率发生器
        int[] count = new int[8];
        for (int i = 0; i < testTime; i++) {
            count[f2_2()]++;
        }

        for (int i = 0; i < count.length; i++) {
            System.out.println(i + " : " + (double) count[i] / (double) testTime);
        }
    }
}
